﻿using System;

namespace XUtility
{
    #region DateTime 类型 扩展方法

    public static class DateTimeEx
    {
        #region 返回时间 yyyy-MM-dd 格式 例如 2012-01-15
        /// <summary>
        /// 返回时间 yyyy-MM-dd 格式 例如 2012-01-15
        /// </summary>
        /// <param name="d">格式化时间</param>
        public static String ToNormalString(this DateTime d)
        {
            return d.ToCustomString("-");
        }
        /// <summary>
        /// 返回时间 yyyy-MM-dd 格式 例如 2012-01-15
        /// </summary>
        /// <param name="d">格式化时间</param>
        public static String ToNormalString(this DateTime? d)
        {
            return (d.HasValue ? ToNormalString(d.Value) : String.Empty);
        }
        #endregion

        #region 返回时间 yyyy-MM-dd HH:mm:ss 格式 例如 2012-01-15 18:25:36 使用24小时制格式化日期
        /// <summary>
        /// 返回时间 yyyy-MM-dd HH:mm:ss 格式 例如 2012-01-15 18:25:36 使用24小时制格式化日期
        /// </summary>
        /// <param name="d">格式化时间</param>
        public static String ToNormalAndTimeString(this DateTime d)
        {
            return d.ToCustomString("-", ":", true, null);
        }
        /// <summary>
        /// 返回时间 yyyy-MM-dd HH:mm:ss 格式 例如 2012-01-15 18:25:36 使用24小时制格式化日期
        /// </summary>
        /// <param name="d">格式化时间</param>
        public static String ToNormalAndTimeString(this DateTime? d)
        {
            return (d.HasValue ? ToNormalAndTimeString(d.Value) : String.Empty);
        }
        #endregion

        #region 返回时间 yyyy-MM-dd 时:分:秒 格式 例如 2012-01-15 时:分:秒 自定义制式[12、24]
        /// <summary>
        /// 返回时间 yyyy-MM-dd 时:分:秒 格式 例如 2012-01-15 时:分:秒 自定义制式[12、24]
        /// </summary>
        /// <param name="d">格式化时间</param>
        /// <param name="is24Hour">24制式为true，12制式为false</param>
        public static String ToNormalAndTimeString(this DateTime d, Boolean is24Hour)
        {
            return d.ToCustomString("-", ":", true, is24Hour);
        }
        #endregion

        #region 返回自定义时间格式
        /// <summary>
        /// 返回自定义时间格式 [年-月-日]
        /// </summary>
        /// <param name="d">格式化时间 [年-月-日]</param>
        /// <param name="c">时间分隔符</param>
        public static String ToCustomString(this DateTime d, String c)
        {
            return d.ToCustomString(c, null, false, null);
        }
        /// <summary>
        /// 返回自定义时间格式 [年-月-日 时:分:秒]
        /// </summary>
        /// <param name="d">格式化时间 [年-月-日 时:分:秒]</param>
        /// <param name="c1">前段时间分隔符</param>
        /// <param name="c2">后段时间分隔符</param>
        /// <param name="showTime">是否显示时分秒</param>
        /// <param name="isTime24">是否显示时分秒</param>
        public static String ToCustomString(this DateTime d, String c1, String c2, Boolean showTime, Boolean? is24Hour)
        {
            if(d == null)
            {
                throw new ArgumentNullException("时间常用格式化出错 时间参数不能为空");
            }

            #region 时间格式化
            String format = "yyyy" + c1 + "MM" + c1 + "dd";
            if(showTime)
            {
                String formatTime = " HH" + c2 + "mm" + c2 + "ss";
                if(is24Hour.HasValue)
                {
                    if(!is24Hour.Value)
                    {
                        formatTime = " hh" + c2 + "mm" + c2 + "ss";
                    }
                }
                format += (formatTime);
            }
            #endregion

            return d.ToString(format);
        }
        #endregion

        #region 返回数据库时间格式

        /// <summary>
        /// 返回单引号扩住的字符串  
        /// </summary>
        /// <param name="d">输入字符串</param>
        /// <returns>单引号</returns>
        public static String ToSingleQuote(this DateTime d)
        {
            return ("\'" + d.ToString() + "\'");
        }
        /// <summary>
        /// 返回单引号扩住的字符串  
        /// </summary>
        /// <param name="d">输入字符串</param>
        /// <returns>单引号</returns>
        public static String ToSingleQuote(this DateTime? d)
        {
            String str = (d.HasValue ? ToSingleQuote(d.Value) : "null");
            return str;
        }
        /// <summary>
        /// 返回双引号扩住的字符串  
        /// </summary>
        /// <param name="d">输入字符串</param>
        /// <returns>双引号</returns>
        public static String ToDoubleQuote(this DateTime d)
        {
            return ("\"" + d.ToNormalString() + "\"");
        }

        #endregion

        /// <summary>
        /// 将DateTime时间格式转换为Unix时间戳格式
        /// </summary>
        /// <param name="time">日期数据</param>
        /// <param name="lan">返回格式的长度，一般是10，或者13，表示精确到毫秒</param>
        /// <returns>long</returns>
        public static long? ToUnix(this DateTime? time, Int32 lan = 10)
        {
            if (time == null)
            {
                return null;
            }
            return time.Value.ToUnix(lan);
        }

        /// <summary>
        /// 将DateTime时间格式转换为Unix时间戳格式
        /// </summary>
        /// <param name="time">日期数据</param>
        /// <param name="lan">返回格式的长度，一般是10，或者13，表示精确到毫秒</param>
        /// <returns>long</returns>
        public static long? ToUnix(this DateTime time, Int32 lan = 10)
        {
            var startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
            long t = (time.Ticks - startTime.Ticks) / 10000;
            if (lan == 10)
            {
                t = t / 1000;
            }
            return t;
        }
    }
    #endregion
}
